package com.yy.studyspringboot.guava;

/*
 Guava 工具学习：Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库，
     例如：集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、
     并发库 [concurrency libraries] 、通用注解 [common annotations] 、
     字符串处理 [string processing] 、I/O 等等

    导包：
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>19.0</version>
        </dependency>


        学习网站：https://ifeve.com/google-guava/

 */
public class GuavaUtil {




    public static void main(String[] args) {
        //1. 基本工具 [Basic utilities]
        //
        /**
         1.1 使用和避免null -- Optional
         创建Optional实例（以下都是静态方法）：
             Optional.of(T)	创建指定引用的Optional实例，若引用为null则快速失败
             Optional.absent()	创建引用缺失的Optional实例
             Optional.fromNullable(T)	创建指定引用的Optional实例，若引用为null则表示缺失
         用Optional实例查询引用（以下都是非静态方法）：
             boolean isPresent()	如果Optional包含非null的引用（引用存在），返回true
             T get()	返回Optional所包含的引用，若引用缺失，则抛出java.lang.IllegalStateException
             T or(T)	返回Optional所包含的引用，若引用缺失，返回指定的值
             T orNull()	返回Optional所包含的引用，若引用缺失，返回null
            Set<T> asSet()	返回Optional所包含引用的单例不可变集，如果引用存在，返回一个只有单一元素的集合，如果引用缺失，返回一个空集合。
         */
//        String aa = "aaa";
//        Optional of1 = Optional.of(aa); //aa不能为null,否则会抛出异常
//        Optional<String> nullable = Optional.fromNullable(aa); //aa可以为null,
//        boolean b = of1.isPresent();// returns true  判断是否为null
//        Object value = of1.get();// returns 5  返回具体的值
//        String s = nullable.orNull();  //返回具体的值，为null则返回null
//        Optional<String> bb = nullable.or(Optional.of("bb"));  //如果aa为null，则返回bb,  否则还是aa


        /**
         1.2 前置条件: 让方法中的条件检查更简单  -- Preconditions
                 方法声明（不包括额外参数）	                描述                              	检查失败时抛出的异常
                 checkArgument(boolean)	检查boolean是否为true，用来检查传递给方法的参数。	IllegalArgumentException
                 checkNotNull(T)	检查value是否为null，该方法直接返回value，因此可以内嵌使用checkNotNull。	NullPointerException
                 checkState(boolean)	用来检查对象的某些状态。	IllegalStateException
                 checkElementIndex(int index, int size)	检查index作为索引值对某个列表、字符串或数组是否有效。index>=0 && index<size *	IndexOutOfBoundsException
                 checkPositionIndex(int index, int size)	检查index作为位置值对某个列表、字符串或数组是否有效。index>=0 && index<=size *	IndexOutOfBoundsException
                 checkPositionIndexes(int start, int end, int size)	检查[start, end]表示的位置范围对某个列表、字符串或数组是否有效*	IndexOutOfBoundsException
         */
//        Preconditions.checkArgument(1 == 1);
//        Preconditions.checkNotNull(1);


        /** 1.3 前置条件: 让方法中的条件检查更简单 -- Objects
         */
//        Objects.equal("a", "a"); // returns true
//        Objects.equal(null, "a"); // returns false
//        Objects.equal("a", null); // returns false
//        Objects.equal(null, null); // returns true


        /** 1.4 排序: Guava强大的”流畅风格比较器” -- Ordering
             创建排序器：常见的排序器可以由下面的静态方法创建
                     natural()	对可排序类型做自然排序，如数字按大小，日期按先后排序
                     usingToString()	按对象的字符串形式做字典排序[lexicographical ordering]
                     from(Comparator)	把给定的Comparator转化为排序器
            链式调用方法：通过链式调用，可以由给定的排序器衍生出其它排序器
                 reverse()	获取语义相反的排序器
                 nullsFirst()	使用当前排序器，但额外把null值排到最前面。
                 nullsLast()	使用当前排序器，但额外把null值排到最后面。
                 compound(Comparator)	合成另一个比较器，以处理当前排序器中的相等情况。
                 lexicographical()	基于处理类型T的排序器，返回该类型的可迭代对象Iterable<T>的排序器。
                 onResultOf(Function)	对集合中元素调用Function，再按返回值用当前排序器排序。
         */
//        Ordering<Integer> byLengthOrdering = new Ordering<Integer>() {
//            public int compare(Integer left, Integer right) {
//                return left - right;
//            }
//        };
//        List<Integer> ints = Lists.newArrayList(5, 3, 0, 9);
//        Integer max = byLengthOrdering.max(ints);

//        Ordering<Comparable> ordering = Ordering.natural();
//        List<Integer> ints2 = Lists.newArrayList(5, 3, 0, 9);
//        Integer max1 = ordering.max(ints2);


        // 2. 集合[Collections]
        /** 2.1 不可变集合: 用不变的集合进行防御性编程和性能提升。-- Immutable开头人集合
            ImmutableSet
            ImmutableList
            ImmutableMap
            ImmutableBiMap
            ImmutableCollection
            ImmutableRangeMap
         */
//        ImmutableSet<String> COLOR_NAMES = ImmutableSet.of( "red","orange","yellow","green","blue","purple");

        /** 2.2 新集合类型: multisets, multimaps, tables, bidirectional maps等
          multisets : 无序的 ArrayList  Multiset {a, a, b}和{a, b, a}是相等的
         */

        /** 2.3 强大的集合工具类: 提供java.util.Collections中没有的集合工具

         */
//        Multiset<Integer> multiset = HashMultiset.<Integer>create();
//        multiset.add(1);
//        multiset.add(1);
//        multiset.add(2,3); //存入3个2
//        Set<Integer> set1 = multiset.elementSet();

        /** 2.4 扩展工具类：让实现和扩展集合类变得更容易，比如创建Collection的装饰器，或实现迭代器
            Lists、Sets、Maps、Queues、Multisets、Multimaps、Maps、Tables、Collections2
         */
//        ArrayList<Object> list = Lists.newArrayList();
//        HashSet<Object> set = Sets.newHashSet();
//        HashMap<Object, Object> map = Maps.newHashMap();
//
//        List<String> names = Lists.newArrayList("John", "Adam", "Tom");
//        Function<String,Integer> func = new Function<String,Integer>(){
//            public Integer apply(String input) {
//                return input.length();
//            }
//        };
//        Multimap<Integer, String> groups = Multimaps.index(names, func);


        // 3-缓存
        /**
         CacheLoader
         */

        /**

         */



    }


}
